//package com.huilan.hgt.util;
//
//import lombok.extern.slf4j.Slf4j;
//import net.sf.cglib.beans.BeanGenerator;
//import net.sf.cglib.beans.BeanMap;
//import org.apache.commons.beanutils.PropertyUtils;
//
//import java.beans.PropertyDescriptor;
//import java.util.HashMap;
//import java.util.Map;
//
///**
// * 动态代理类
// *
// * @author ghy
// * @date 2018-07-28 下午5:32
// **/
//@Slf4j
//public class DynamicBean {
//    /**
//     * 目标对象
//     */
//    private Object target;
//
//    /**
//     * 属性集合
//     */
//    private BeanMap beanMap;
//
//    public DynamicBean(Class clazz, Map<String, Class> propertyMap) {
//        this.target = generateBean(clazz, propertyMap);
//        this.beanMap = BeanMap.create(this.target);
//    }
//
//
//    /**
//     * bean 添加属性和值
//     *
//     * @param property
//     * @param value
//     */
//    public void setValue(String property, Object value) {
//        beanMap.put(property, value);
//    }
//
//    /**
//     * 获取属性值
//     *
//     * @param property
//     * @return
//     */
//    public Object getValue(String property) {
//        return beanMap.get(property);
//    }
//
//    /**
//     * 获取对象
//     *
//     * @return
//     */
//    public Object getTarget() {
//        return this.target;
//    }
//
//
//    /**
//     * 根据属性生成对象
//     *
//     * @param clazz
//     * @param propertyMap
//     * @return
//     */
//    private Object generateBean(Class clazz, Map<String, Class> propertyMap) {
//        BeanGenerator generator =new BeanGenerator();
//        if(null != clazz) {
//            generator.setSuperclass(clazz);
//        }
//        BeanGenerator.addProperties(generator, propertyMap);
//        return generator.create();
//    }
//
//
//    public static Object getTarget(Object obj, Map<String, Object> addProperties) {
//        // 获取属性集合
//        PropertyDescriptor[] propertyDescriptors = PropertyUtils.getPropertyDescriptors(obj);
//        Map<String, Class> propertyMap = new HashMap<>();
//        for(PropertyDescriptor propertyDescriptor : propertyDescriptors) {
//            if(!"class".equalsIgnoreCase(propertyDescriptor.getName())) {
//                propertyMap.put(propertyDescriptor.getName(), propertyDescriptor.getPropertyType());
//            }
//        }
//
//        // 将自定义添加属性加入到集合中
//        for(Map.Entry<String, Object> entry : addProperties.entrySet()){
//            propertyMap.put(entry.getKey(), entry.getValue().getClass());
//        }
//
//        // new dynamic bean
//        DynamicBean dynamicBean =new DynamicBean(obj.getClass(), propertyMap);
//
//        // 为代理类设置值
//        for(String k : propertyMap.keySet()){
//            try{
//                if(!addProperties.containsKey(k)) {
//                    // 给代理类中的原生实体属性设置值
//                    Object value = PropertyUtils.getNestedProperty(obj, k);
//                    dynamicBean.setValue(k, value);
//                }else{
//                    // 给代理类中的自定义属性设置值
//                    Object value = addProperties.get(k);
//                    dynamicBean.setValue(k, value);
//                }
//
//            }catch (Exception e) {
//                log.error(e.getMessage(), e);
//            }
//        }
//        return dynamicBean.getTarget();
//    }
//}
